﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/contest/61570/C
/*
题目描述：
链接：https://ac.nowcoder.com/acm/contest/61570/C
来源：牛客网

题目描述
游游有
𝑛
n个苹果，
𝑚
m个桃子。她可以把2个苹果和1个桃子组成价值
𝑎
a元的一号水果大礼包，也可以把1个苹果和2个桃子组成价值
𝑏
b元的二号水果大礼包。游游想知道，自己最多能组成多少价值总和的大礼包？
输入描述:
四个正整数
𝑛
,
𝑚
,
𝑎
,
𝑏
n,m,a,b，用空格隔开。分别代表苹果的数量、桃子的数量、一号大礼包价值、二号大礼包价值。
1
≤
𝑛
,
𝑚
,
𝑎
,
𝑏
≤
1
0
6
1≤n,m,a,b≤10
6

输出描述:
一个整数，代表大礼包的最大价值总和。
示例1
输入
复制
3 4 1 2
输出
复制
4
说明
组成两个二号水果大礼包，使用了2个苹果和4个桃子。总价值为4。
示例2
输入
复制
1 1 5 6
输出
复制
0
说明
显然无法组合成任意一个大礼包
*/

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
// 方法1——记忆化搜索(超时)
unordered_map<int, unordered_map<int, int>> _hash;
int n, m, a, b;
int dfs(int i, int j) {
    if (_hash.count(i) && _hash[i].count(j)) {
        return _hash[i][j];
    }
    if (i <= 0 && j <= 0) {
        return 0;
    }
    int ret = 0;
    if (i >= 2 && j >= 1) {
        ret = dfs(i - 2, j - 1) + a;
    }
    if (i >= 1 && j >= 2) {
        ret = max(ret, dfs(i - 1, j - 2) + b);
    }
    _hash[i][j] = ret;
    return ret;
}
int main() {
    cin >> n >> m >> a >> b;
    long long ret = 0;
    // 方法2——枚举(正解)
    int max_x = min((n / 2), m);
    for (int x = 0; x <= min(n / 2, m); x++) {
        int y = min(n - 2 * x, (m - x) / 2);
        ret = max(ret, (long long)a * x + (long long)b * y);
    }
    cout << ret << endl;
    return 0;
}